Universo Online
Web Sites Pessoais
Anterior Próximo Índice

Chamando uma Rotina Próxima em Assembly a partir do Turbo Pascal.

Os argumentos de uma rotina em Turbo Pascal são colocados pilha na ordem em que eles aparecem na declaração dos parâmetros formais: o primeiro, da esquerda para a direita, é colocado em primeiro lugar, seguido dos demais, até o último. Como cada argumento, no exemplo, ocupa 2 bytes na pilha, a rotina tem de retirar esses argumentos usando RET seguido pelo número de bytes colocados na pilha (no nosso exemplo, 6 bytes, que escrevemos como 2+2+2 para ilustrar melhor o método usado. A configuração da pilha em uma chamada deve ser essa:

SP     =  Valor Inicial de SP
SP - 2 = Valor de SP após empilhar o primeiro parâmetro
SP - 4 = Valor de SP após empilhar o segundo parâmetro
SP - 6 = Valor de SP após empilhar o terceiro parâmetro
SP - 8 = Valor de SP após a chamada da rotina empilhar o valor de IP
SP - 10 = Valor de SP após a rotina empilhar o valor de BP
Lembre-se, BP é usado pelo 8086 para acessar um valor na pilha. Após mover para BP o último valor de SP, ou seja, SP Inicial menos 10, a pilha fica com essa configuração:

Endereço do primeiro parâmetro em relação a SS = [BP + 8] = [(SP - 10) + 8] = [SP - 2]

Endereço do segundo parâmetro em relação a SS= [BP + 6] = [(SP - 10) + 6] = [SP - 4]

Endereço do terceiro parâmetro em relação a SS = [BP + 4] = [(SP - 10) + 4] = [SP - 6]

;PROCP.ASM
;DEMONSTRACAO DE UMA ROTINA COM 3 PARAMETROS
;CHAMAR DE PROGRAMA EM TURBO PASCAL
;PARA MONTAR DIGITE: nasm -fobj procp.asm


segment CODE class=CODE align=1
;------------------------------------------------------
;function ParamDemo(x, y, z : integer):integer;external
;------------------------------------------------------
   GLOBAL ParamDemo         

ParamDemo:
          PUSH BP
          MOV  BP,SP
          PUSH DS

          MOV  AX, [BP + 8] ; AX := primeiro parametro
          ADD  AX, [BP + 6] ; soma AX com segundo parametro
          ADD  AX, [BP + 4] ; soma AX com terceiro parametro
          ;retorna resultado em AX
          POP DS
          POP BP
          RET 2+2+2         ; retira os 3 parametros da pilha


{ Essa é a rotina em Turbo Pascal que chama a rotina assembly }
program ParametroDemo;
{$L procp}
function ParamDemo(x,y,z: integer): integer; external;

var total: integer;
BEGIN
  total := ParamDemo(1,2,3);
  writeln;
  writeln('1+2+3 = ',total);
END.

                  
Anterior Próximo Índice